作者:寒宝儿_____ | 来源:互联网 | 2023-07-31 20:51
篇首语:本文由编程笔记#小编为大家整理,主要介绍了HanLP 基于朴素贝叶斯 训练 文本分类相关的知识,希望对你有一定的参考价值。
一、HanLP 朴素贝叶斯分类器
HanLP
针对文本分类算法已经帮我们实现 朴素贝叶斯法 ,用户可以无需关心内部细节,HanLP
也提供了相关自定义训练接口,前提需要将数据集根据分类放到不同的目录中,例如:
官方给出了相关性能指标如下表所示,其中 SVM
在本专栏下篇文章进行演示:
有关于 HanLP 环境的搭建,可以参考下面这篇文章:
https://xiaobichao.blog.csdn.net/article/details/128271909
准备语料库
下面通过使用 HanLP
基于朴素贝叶斯算法,实现文本分类,语料库采用搜狗文本分类语料库迷你版
测试数据集,下载数据集:
http://file.hankcs.com/corpus/sogou-text-classification-corpus-mini.zip
下载加压后可以发现该数据集已经标注好:
文本样例:
训练数据
public class ClassifyTrain
public static void main(String[] args) throws IOException
String dataPath = "F:/bigdata/hanlp/sogou-text-classification-corpus-mini/搜狗文本分类语料库迷你版";
String modelPath = "F:/bigdata/hanlp/sogou-text-classification-corpus-mini/classification-model.ser";
trainData(dataPath, modelPath);
private static void trainData(String dataPath, String modelPath) throws IOException
File corpusFolder = new File(dataPath);
if (!corpusFolder.exists() || !corpusFolder.isDirectory())
System.err.println("没有文本分类语料");
return;
IDataSet trainingCorpus = new FileDataSet()
.setTokenizer(new HanLPTokenizer())
.load(dataPath, "UTF-8", 0.9);
IClassifier classifier = new NaiveBayesClassifier();
classifier.train(trainingCorpus);
AbstractModel model = classifier.getModel();
IDataSet testingCorpus = new MemoryDataSet(model)
.load(dataPath, "UTF-8", -0.1);
FMeasure result = Evaluator.evaluate(classifier, testingCorpus);
System.out.println("测试集准确度:");
System.out.println(result);
IOUtil.saveObjectTo(model, modelPath);
查看训练日志:
查看训练模型:
测试模型
public class TestClassify
public static void main(String[] args)
String modelPath = "F:/bigdata/hanlp/sogou-text-classification-corpus-mini/classification-model.ser";
testModel(modelPath);
private static void testModel(String modelPath)
NaiveBayesModel model = (NaiveBayesModel) IOUtil.readObjectFrom(modelPath);
IClassifier classifier = new NaiveBayesClassifier(model);
String text1 = "研究生考录模式亟待进一步专业化";
System.out.printf("《%s》 属于分类 【%s】\\n", text1, classifier.classify(text1));
String text2 = "C罗获2018环球足球奖最佳球员 德尚荣膺最佳教练";
System.out.printf("《%s》 属于分类 【%s】\\n", text2, classifier.classify(text2));
String text3 = "英国造航母耗时8年仍未服役 被中国速度远远甩在身后";
System.out.printf("《%s》 属于分类 【%s】\\n", text3, classifier.classify(text3));
String text4 = "如果真想用食物解压,建议可以食用燕麦";
System.out.printf("《%s》 属于分类 【%s】\\n", text4, classifier.classify(text4));
测试结果: